package mathStudy

import (
	"sort"
)

func IsAnagram(s, t string) bool {
	arr := [26]int{}
	for _, s1 := range s {
		arr[s1-rune('a')]++
	}
	for _, t1 := range t {
		arr[t1-rune('a')]--
	}
	return arr == [26]int{}
}

func RansomMall(ransom, magazine string) bool {
	arr := [26]int{}
	for _, r1 := range ransom {
		arr[r1-rune('a')]++
	}
	for _, m1 := range magazine {
		arr[m1-rune('a')]--
	}
	for _, i := range arr {
		if i > 0 {
			return false
		}
	}
	return true
}

// 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
//
// 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
//
// 示例 1:
//
// 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
// 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
func groupAnagrams(strs []string) [][]string {
	mapp := make(map[string][]string)
	for _, str := range strs {
		var arr []string
		bytes := []byte(str)
		//字节数组进行排序
		sort.Slice(bytes, func(i, j int) bool {
			return bytes[i] < bytes[j]
		})
		byteToString := string(bytes) //字节数组转为字符串
		if mapp[byteToString] == nil {
			arr := append(arr, str)
			mapp[byteToString] = arr
		} else {
			arr = append(mapp[byteToString], str)
			mapp[byteToString] = arr
		}
	}
	//定义一个二维数组
	arrSec := make([][]string, 0, len(mapp))
	for _, s := range mapp {
		arrSec = append(arrSec, s)
	}
	return arrSec
}

func FindAnagrams(s string, p string) (ans []int) {
	sLen, pLen := len(s), len(p)
	if sLen < pLen {
		return
	}

	var sCount, pCount [26]int
	for i, ch := range p {
		sCount[s[i]-'a']++
		pCount[ch-'a']++
	}
	if sCount == pCount {
		ans = append(ans, 0)
	}

	for i, ch := range s[:sLen-pLen] {
		sCount[ch-'a']--        //s进行循环字符判断 -- 与++进行抵消
		sCount[s[i+pLen]-'a']++ //s[i+pLen]指的是 当前循环的索引+p的长度
		if sCount == pCount {
			ans = append(ans, i+1)
		}
	}
	return
}

//给定两个字符串 s 和 p，找到 s 中所有 p 的 异位词 的子串，返回这些子串的起始索引。不考虑答案输出的顺序。
//
//异位词 指由相同字母重排列形成的字符串（包括相同的字符串）。
//
//
//
//示例 1:
//
//输入: s = "cbaebabacd", p = "abc"
//输出: [0,6]
//解释:
//起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
//起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
//示例 2:
//
//输入: s = "abab", p = "ab"
//输出: [0,1,2]
//解释:
//起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
//起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
//起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词

// 题意：给定两个数组，编写一个函数来计算它们的交集
func getIntersection(arr1 []int, arr2 []int) (arr3 []int) {

	return nil
}
